package graphik;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.util.Collection;
import java.util.HashSet;

import javax.swing.JFrame;
import javax.swing.JScrollPane;

public class EinfachesFenster extends JFrame {

	private static final long serialVersionUID = 1L;
	private Collection<Linie> linien = new HashSet<Linie>();
	private Collection<Textfeld> texte = new HashSet<Textfeld>();
	private MalFlaeche panel;
	private int breite;
	private int hoehe;
	private static Font font = new Font(Font.MONOSPACED, Font.BOLD, 14);
	
	/** Konstruktor zur Erzeugung des Fensters, das noch nicht
	 * angezeigt wird. Die Ausgabe erfolgt erst durch den Aufruf
	 * der Methode setGroesse.
	 */
	public EinfachesFenster(){
		panel = new MalFlaeche(this);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		JScrollPane js = new JScrollPane(panel);
		
		add(js);
		panel.setFont(font);
		panel.setBackground(Color.WHITE);
		panel.setForeground(Color.BLACK);

		Toolkit tk = Toolkit.getDefaultToolkit();
		tk.setDynamicLayout( true );
	}
	
	/** Methode zur Bestimmung der Texthoehe in Pixeln in der
	 * Ausgabe.
	 * @param text Beispieltext, fuer den die Hoehe geprueft werden soll
	 *   (wird in dieser Implementierung nicht genutzt)
	 * @return Hoehe des aktuell genutzten Fonts in Pixeln
	 */
	public int texthoehe(String text) {
		return getFontMetrics(font).getHeight();
	}

	/** Methode zur Bestimmung der Textbreite in Pixeln in der
	 * Ausgabe fuer den uebergebenen Text.
	 * @param text Text, dessen Laenge in Pixeln berechnet werden soll
	 * @return Laenge des uebergebenen Textes in Pixeln bei einer 
	 *    moeglichen Ausgabe.
	 */
	public int textbreite(String text) {
		return getFontMetrics(font).stringWidth(text);
	}

	/** Methode zur Festlegung der Groesse des Ausgabefensters.
	 * Das Fenster wird erst nach dem erstmaligen Aufruf dieser
	 * Methode sichtbar.
	 * @param breite Breite des Ausgabefensters in Pixeln
	 * @param gesamthoehe Hoehe des Ausgebafensters in Pixeln
	 */
	public void setGroesse(int breite, int gesamthoehe) {
		this.breite = breite +15; //schmudelig
		this.hoehe = gesamthoehe;
		Dimension d = new Dimension(this.breite,this.hoehe);
		panel.setPreferredSize(d);
		panel.setMaximumSize(d);
		panel.setMinimumSize(d);
		panel.setSize(d);
		panel.setDoubleBuffered(true);
		
		setVisible(true);
		pack();
	}

	/** Methode zum Hinzufuegen einer Linie.
	 * Der Ursprung (0,0) befindet sich links-oben im Fenster,
	 * X-Werte werden nach rechts, Y- Werte nach unten groesser.
	 * @param startX X-Ordinate des Startpunktes der Linie
	 * @param startY Y-Ordinate des Startpunktes der Linie
	 * @param endeX X-Ordinate des Endpunktes der Linie
	 * @param endeY Y-Ordinate des Endpunktes der Linie
	 */
	public void linie(int startX, int startY, int endeX, int endeY) {
		linien.add(new Linie(startX,startY,endeX,endeY));		
	}

	/** Methode zum Hinzufuegen eines Textes, dabei wird der Text
	 * oberhalb dieses Punktes dargestellt.
	 * Der Ursprung (0,0) befindet sich links-oben im Fenster,
	 * X-Werte werden nach rechts, Y- Werte nach unten groesser.
	 * @param x X-Ordinate des Ausgangspunktes des Textes (links unten)
	 * @param y Y-Ordinate des Ausgangspunktes des Textes (links unten)
	 * @param text auszugebender Text
	 */
	public void schreibe(int x, int y, String text) {
		texte.add(new Textfeld(x,y,text));
	}
	
	public void malen(Graphics g){
		g.clearRect(0, 0, breite, hoehe);
		for(Linie l:linien)
			g.drawLine(l.getStartX(), l.getStartY(), l.getEndeX(), l.getEndeY());
		for(Textfeld t:texte)
			g.drawString(t.getText(), t.getXpos(), t.getYpos());
	}

}
